from tools.ffz_pcap_reader.ip_layer import PcapIpLayer
from tools.ffz_pcap_reader.mac_layer import PcapMacLayer

from tools.ffz_pcap_reader.pcap_exception import PcapReadException


class MyPacket:
    """
    Packet类

    该类只记录 “ipv4” 且 “ip部分的header长度为 20” 的数据包

    并且只记录下数据包的传输层字段的内容部分。
    因为传输层建立连接的过程，这些数据包，我们是通过调用socket完成的，通过编程较难实现。
    """
    header: bytes
    frame: bytes
    mac_layer: PcapMacLayer
    ip_layer: PcapIpLayer
    tcp_payload: bytes

    def __init__(self, header, data: bytes):
        self.header = header
        self.frame = data
        self.mac_layer = PcapMacLayer(data[:6], data[6:12], data[12:14])
        # 切换到IP字段
        data = data[14:]
        if data[0] != 69:
            raise PcapReadException("Ip version or header len is Not Right")
        self.ip_layer = PcapIpLayer(data[12:16], data[16:20])
        # IP偏移20Bytes 切换到TCP字段
        data = data[20:]
        # 只取字段的高位数据 并且最终字段值需要乘以4
        tcp_header_len = data[12]
        tcp_header_len = (tcp_header_len >> 4) * 4
        data = data[tcp_header_len:]
        # tcp的数据部分 payloads
        self.tcp_payload = data
